#include "Servidor.h"
#include <unistd.h>
#include <iostream>
#include <sys/types.h>
#include <sys/wait.h>
#include "SignalHandler.h"

#define ACONSULTOR "../make.sh"
#define DECLIENTE "../Makefile"
#define LETRA 'a'

using namespace std;

Servidor :: Servidor () {
	// Registro de señales.
	SignalHandler* sh = SignalHandler :: getInstance();
	sh->registrarHandler(SIGINT, &sigint_handler);
	sh->registrarHandler(SIGCHLD, &sigchld_handler);
	cantidadHijos = 0;
	
	this->deCliente = new Cola<mensaje> ( (char*) DECLIENTE, LETRA );
	this->aConsultor = new Cola<mensaje> ( (char*) ACONSULTOR, LETRA );
}


Servidor :: ~Servidor () {
	SignalHandler::destruir();
	this->deCliente->destruir();
	this->aConsultor->destruir();
	delete this->deCliente;
	delete this->aConsultor;
}


int Servidor :: recibirPeticion () {
	int resultado = this->deCliente->leer ( SERVIDOR,&(this->peticion) );
	//cout << "Lee el Servidor: " << (this->peticion).texto << endl;
	return resultado;
}


void Servidor :: retrasmitirPeticion () {
	this->aConsultor->escribir ( this->peticion );
}


int Servidor::correr() {

	while(!sigint_handler.getGracefulQuit()) {
		int resultado = recibirPeticion();
		
		if(sigchld_handler.getGracefulQuit()){
			sigchld_handler.restaurarEstado();
			waitpid(-1, NULL, WNOHANG);
			cantidadHijos--;	
		}
		
		if(sigint_handler.getGracefulQuit() or (resultado == -1 and errno == EINTR))	
			continue;
		
		pid_t pid = fork();
		if ( pid == 0 )
			execlp( (char*) "./procConsultor", (char*) "procConsultor", (char*) NULL);
		cantidadHijos++;
	
		retrasmitirPeticion();
	}
	
	for(int i = 0; i < cantidadHijos; i++)
		wait(NULL);

	return(0);
	
}

